package com.shujia.core

import com.shujia.core.Demo10Join.Student
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD

object Demo19ForeachPartition {
  def main(args: Array[String]): Unit = {
    /**
     * mapPartitions vs foreachPartition
     * 都是由于 连接不能被序列化 避免每条数据都去建立/销毁连接导致额外的开销
     * 进而提高效率
     * 怎么选？
     * 如果只是想从外部系统获取数据 选择 mapPartitions
     * 如果只是想将数据保存到外部系统 选择 foreachPartition
     */

    val conf: SparkConf = new SparkConf()
    conf.setAppName("Demo19ForeachPartition")
    conf.setMaster("local")

    val sc: SparkContext = new SparkContext(conf)

    val stuRDD: RDD[Student] = sc
      .textFile("Spark/data/students.txt", 4)
      .map(line => {
        val splits: Array[String] = line.split(",")
        val id: String = splits(0)
        val name: String = splits(1)
        val age: Int = splits(2).toInt
        val gender: String = splits(3)
        val clazz: String = splits(4)
        Student(id, name, age, gender, clazz)
      })

    // 假设将数据保存到MySQL
    stuRDD
      // 对每个分区进行操作 没有返回值
      .foreachPartition(stuIter => {
        // 直接打印 保存到MySQL的逻辑 类似mapPartitions
        stuIter
          .foreach(stu => {
            println(s"${stu.id},${stu.name}")
          })
      })


  }

}
